package com.zln.hello;

/**
 * 自动类型转换注意和细节
 */
public class AutoConvertDetail {
    public static void main (String[] args){
//        1. 有多种类型的数据混合运算时，系统首先自动将会所有数据转换成容量最大的那种数据类型，然后再进行计算。
        int n1 = 10; //ok
        //float d1 = n1 + 1.1; //error  n1 + 1.1 => 结果类型是double
        //double d1 = n1 + 1.1; //ok  (解决方法一)
        double d1 = n1 + 1.1F; //ok  (解决方法二:告诉 1.1是float类型)  n1 + 1.1 =>  结果类型是float

//        2. 当我们把精度（容量）大的数据类型赋值给精度（容量）小的数据类型就会报错，反之就会进行自动类型转换。
        // int n2 = 1.1; //error   double -> int

//        3. （byte，short）和char之间不会相互自动转换。
        // 当把数赋给 byte 时，先判断该数是否在byte范围内，如果是就可以  (先判断范围，再确认类型)
        byte b1 = 10; // ok, -128-127
        // int n2 = 1;
        //byte b2 = n2;  //error 如果是按变量赋值，则先判断类型
        //char c1 = b1; //error b1已经是有类型了，它已经分配了空间了，它就是一个byte，byte不能自动转换成char

//        4. byte，short，char 他们三者可以计算，在计算时首先转换为int类型
        byte b2 = 1;
        byte b3 = 2;
        short s1 = 1;
        //short s2 = b2 + s1; //error b2 + s1 => int
        int s2 = b2 + s1; //ok b2 + s1 => int
        // byte b4 = b2 + b3;  //error 只要参与运算，就会变成int  b2 + b3 => int

//        5. boolean 不参与转换
        boolean pass = true;
        // int num100 = pass; //error boolean 不参与类型的自动转换

//        6. 自动提升原则：表达式结果的类型自动提升为 操作数中最大的类型
        // 看一道题
        byte b4 = 1;
        short s3 = 100;
        int num200 = 1;
        double num300 = 1.1;
        double num500 = b4 + s3 + num200 + num300;
    }
}
